/*************************************************************************
	> File Name: 001.HZOJ222.cpp
	> Author: Maureen 
	> Mail: Maureen@qq.com 
	> Created Time: 日  2/21 22:06:10 2021
 ************************************************************************/

/*
 * HZOJ222.线段树模板(一)
 * 题目描述
 * 给定一个 𝑛 位数组和两种操作:
 * 操作1：修改数组中某个位置的值
 * 操作2：查询数组中某个区间的最大值
 * 输入
 * 第一行输入两个整数 𝑛,𝑚(1≤𝑛≤10000，3≤𝑚≤100000)，分别代表数组大小和操作数。
 * 第二行包含 𝑛 个整数，代表数组中相应的数字，数字大小不会超过 𝑖𝑛𝑡 表示范围。
 * 接下来 𝑚 行，每行三个整数 𝑎,𝑏,𝑐（𝑎∈[1,2]）
 * 当 𝑎=1 时，代表将数组 𝑏 位置上的值修改成 𝑐，(1≤𝑏≤𝑛, 𝑐 𝑖𝑠 𝑖𝑛𝑡)，当 𝑏>𝑐 时，就忽略本次修改
 * 当 𝑎=2 时，代表询问 [𝑏,𝑐] 区间内的最大值 ( 1≤𝑏,𝑐≤𝑛)，当 𝑏>𝑐 时，输出：-2147483648
 * 输出
 * 对于每个 𝑎=2 的操作，输出查询区间内的最大值。
 */

#include <iostream>
#include <cstdio>
#include <climits>

using namespace std;

#define MAX_N 10000
struct Node {
    int max_num;
} tree[MAX_N << 2];

int arr[MAX_N + 5];

void update(int ind) {
    tree[ind].max_num = max(tree[ind << 1].max_num, tree[ind << 1 | 1].max_num);
    return ;
}

void buildSegmentTree(int ind, int l, int r) {
    if (l == r) {
        tree[ind].max_num = arr[l];
        return ;
    }
    int mid = (l + r) >> 1;
    buildSegmentTree(ind << 1, l, mid);
    buildSegmentTree(ind << 1 | 1, mid + 1, r);
    update(ind);
    return ;
}

void modify(int ind, int l, int r, int pos, int val) {
    if (l == r) {
        tree[ind].max_num = val;
        return ;
    }
    int mid = (l + r) >> 1;
    if (pos <= mid) {
        modify(ind << 1, l, mid, pos, val);
    } else {
        modify(ind << 1 | 1, mid + 1, r, pos, val);
    }
    update(ind);
    return ;
}

int query(int ind, int l, int r, int x, int y) {
    if (x <= l && r <= y) {
        return tree[ind].max_num;
    }
    int ans = INT_MIN;
    int mid = (l + r) >> 1;
    if (x <= mid) {
        ans = max(ans, query(ind << 1, l, mid, x, y));
    } 
    if (mid < y) {
        ans = max(ans, query(ind << 1 | 1, mid + 1, r, x, y));
    }
    return ans;
} 

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &arr[i]);
    }
    buildSegmentTree(1, 1, n);
    int a, b, c;
    for (int i = 0; i < m; i++) {
        scanf("%d%d%d", &a, &b, &c);
        switch (a) {
            case 1: modify(1, 1, n, b, c); break;
            case 2: {
                if (b > c) {
                    printf("-2147483648\n"); 
                    break;
                }
                printf("%d\n", query(1, 1, n, b, c));
            } break;
        }
    }
    return 0;
}
